import appbuilder
import os
import sqlite3
from datetime import datetime
import json
from flask import Flask, render_template, request

# 初始化 Flask 应用
app = Flask(__name__)
# 获取对话总结
def get_dialog_summary(text):
    result = dialog_summary(appbuilder.Message(text))
    print("summary:", result)
    # 提取 LLMMessage 的 content 字段
    if isinstance(result, appbuilder.core.components.llms.base.LLMMessage):
        return result.content  # 返回总结内容的 Unicode 字符串
    return str(result)

# 获取关键标签
def get_tags(text):
    result = tag_extraction(appbuilder.Message(text))

    # 获取 content 字段
    content = result.content  # 获取标签字符串

    # 打印 content 字段内容，检查是否正确
    #print("Content:", content)

    # 按照换行符分割字符串来拆分标签
    tags = content.split("\n")  # 按换行符分割

    # 对标签进行进一步处理：去掉每个标签的数字部分，保留标签文本
    tags_list = [tag.split('.', 1)[1] if '.' in tag else tag for tag in tags]

    # 打印拆分后的标签列表
    print("Tags List:", tags_list)

    return tags_list  # 返回标签列表


# 存储对话、总结和标签到数据库
def store_dialog_to_db(user_id, agent_id, user_message, agent_message, summary, labels, timestamp):
    conn = sqlite3.connect('dialog_summary.db')
    c = conn.cursor()

    # 插入对话记录
    c.execute('''
        SELECT id FROM dialogs WHERE user_id = ? AND agent_id = ? AND timestamp = ?
    ''', (user_id, agent_id, timestamp))
    existing_record = c.fetchone()

    if existing_record:
        # 如果记录存在，更新对应的记录
        c.execute('''
            UPDATE dialogs
            SET user_message = ?, agent_message = ?, summary = ?, labels = ?, timestamp = ?
            WHERE id = ?
        ''', (user_message, agent_message, summary, json.dumps(labels, ensure_ascii=False), timestamp, existing_record[0]))
    else:
        # 如果记录不存在，插入新记录
        c.execute('''
            INSERT INTO dialogs (user_id, agent_id, user_message, agent_message, summary, labels, timestamp)
            VALUES (?, ?, ?, ?, ?, ?, ?)
        ''', (user_id, agent_id, user_message, agent_message, summary, json.dumps(labels, ensure_ascii=False), timestamp))

    conn.commit()
    conn.close()

# 处理每个对话并存储
def process_and_store_dialogs(dialogs):
    for dialog in dialogs:
        # 构造对话文本
        text = f"用户: {dialog['user']}\n坐席: {dialog['agent']}"

        # 获取对话总结
        summary = get_dialog_summary(text)

        # 获取标签
        tags = get_tags(text)

        # 如果总结成功，存储对话信息
        if summary:
            store_dialog_to_db(
                dialog["user_id"],
                dialog["agent_id"],
                dialog["user"],
                dialog["agent"],
                summary,  # 直接存储总结内容
                tags,  # 直接存储标签
                dialog["timestamp"]
            )
        else:
            print(f"Skipping dialog: {dialog['user']}")

# 创建数据库和表格
def create_db():
    conn = sqlite3.connect('dialog_summary.db')
    c = conn.cursor()

    c.execute('''
    CREATE TABLE IF NOT EXISTS dialogs (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        user_id INTEGER NOT NULL,
        agent_id INTEGER NOT NULL,
        user_message TEXT NOT NULL,
        agent_message TEXT NOT NULL,
        summary TEXT,
        labels TEXT,
        timestamp TIMESTAMP NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )''')

    conn.commit()
    conn.close()

# 查询所有对话记录
def query_dialogs():
    conn = sqlite3.connect('dialog_summary.db')
    c = conn.cursor()

    # 查询所有记录
    c.execute('SELECT id, user_id, agent_id, user_message, agent_message, summary, labels, timestamp, created_at FROM dialogs')
    dialogs = c.fetchall()

    conn.close()

    # 打印所有对话记录
    for dialog in dialogs:
        print(f"ID: {dialog[0]}")
        print(f"User ID: {dialog[1]}")
        print(f"Agent ID: {dialog[2]}")
        print(f"User: {dialog[3]}")
        print(f"Agent: {dialog[4]}")
        print(f"Summary: {dialog[5]}")
        print(f"Labels: {dialog[6]}")
        print(f"Timestamp: {dialog[7]}")
        print(f"Created At: {dialog[8]}")
        print("-" * 40)

# 根据关键词和时间范围查询数据库
def search_dialogs(keyword, start_date, end_date):
    conn = sqlite3.connect('dialog_summary.db')
    c = conn.cursor()

    # 如果没有给定开始和结束日期，则只按关键词过滤
    if start_date and end_date:
        c.execute('''
            SELECT id, user_id, agent_id, user_message, agent_message, summary, labels, timestamp, created_at
            FROM dialogs 
            WHERE (user_message LIKE ? OR agent_message LIKE ? OR summary LIKE ? OR labels LIKE ?)
            AND timestamp BETWEEN ? AND ?
        ''', ('%' + keyword + '%', '%' + keyword + '%', '%' + keyword + '%', '%' + keyword + '%', start_date, end_date))
    else:
        c.execute('''
            SELECT id, user_id, agent_id, user_message, agent_message, summary, labels, timestamp, created_at
            FROM dialogs 
            WHERE user_message LIKE ? OR agent_message LIKE ? OR summary LIKE ? OR labels LIKE ?
        ''', ('%' + keyword + '%', '%' + keyword + '%', '%' + keyword + '%', '%' + keyword + '%'))

    dialogs = c.fetchall()
    conn.close()
    return dialogs


# 配置 API 密钥
os.environ["APPBUILDER_TOKEN"] = "bce-v3/ALTAK-ZJ7Pvq3TDIyQ7U3bf2Qlo/d991025b64350b786b087214fe0306d7379c0258"

# 初始化对话总结API
dialog_summary = appbuilder.DialogSummary("Qianfan-Agent-Speed-8k")
tag_extraction = appbuilder.TagExtraction(model="Qianfan-Agent-Speed-8k")

# 假设的对话数据
dialogs = [
    {"user_id": 101, "agent_id": 201, "user": "我想查询一下我的账单，最近总感觉账单有点问题，能帮我看一下吗？我有时感觉有些不明的费用。",
     "agent": "好的，请稍等，我帮您查一下账单信息。请告诉我您最近的账单日期或者账单号，另外，您是否记得哪些费用让您感觉不明？", "timestamp": "2024-11-30T09:00:00"},
    {"user_id": 101, "agent_id": 201, "user": "我查了一下，感觉是上个月的账单，费用比平时多了很多。",
     "agent": "感谢您提供的信息，我已找到您的账单。经检查，确实有一笔来自第三方的费用，可能是您在购物时不小心选择了附加服务。", "timestamp": "2024-11-30T09:15:00"},
    {"user_id": 102, "agent_id": 202, "user": "我的手机坏了，屏幕突然黑屏了，什么都看不见。你们能修吗？",
     "agent": "很抱歉听到这个问题，您可以将手机送到最近的维修中心进行修理，维修费用会根据具体问题而有所不同。", "timestamp": "2024-11-30T09:10:00"},
    {"user_id": 102, "agent_id": 202, "user": "我昨天去了维修中心，检查后发现是屏幕故障，能尽快修好吗？", "agent": "感谢您的反馈，维修中心会优先处理屏幕更换，预计48小时内完成。我们会为您提供修理进度。", "timestamp": "2024-11-30T09:30:00"},
    {"user_id": 103, "agent_id": 203, "user": "为什么我的账户无法登录？我检查过密码，应该没有问题啊。", "agent": "请确保您输入的用户名和密码正确，若有问题可以重置密码。如果问题仍然存在，可能是网络问题，您可以稍后再试。", "timestamp": "2024-11-30T09:20:00"},
    {"user_id": 103, "agent_id": 203, "user": "我已经尝试过重置密码了，还是无法登录，能帮我解决吗？", "agent": "我们正在检查您的账户，发现您的账户在近期有登录异常活动。为了安全起见，我们已经暂时冻结了账户。我们会尽快解冻并发送通知。", "timestamp": "2024-11-30T09:40:00"},
    {"user_id": 104, "agent_id": 204, "user": "我需要了解一下新车的保修政策，尤其是关于电池部分的保修。", "agent": "我们新车的保修政策提供3年或10万公里的保修服务，电池部分的保修时间为5年或20万公里。如果有任何问题，请随时联系。", "timestamp": "2024-11-30T09:30:00"},
    {"user_id": 104, "agent_id": 204, "user": "我想确认一下电池保修是否涵盖更换费用？如果是的话，是全额报销吗？", "agent": "是的，电池保修包括更换费用。如果在保修期内出现电池故障，您只需承担小额检测费用，其他费用会全额报销。", "timestamp": "2024-11-30T09:50:00"},
    {"user_id": 105, "agent_id": 205, "user": "我对最近的服务非常不满，服务员态度不好，而且问题也没有得到解决。", "agent": "非常抱歉，能告诉我您具体的不满之处吗？我们会及时反馈给相关部门，并改进服务质量。", "timestamp": "2024-11-30T09:40:00"},
    {"user_id": 105, "agent_id": 205, "user": "我之前向服务员反映过问题，但没有得到任何实质性的反馈。我想让你们更加重视这个问题。", "agent": "我已经将您的反馈转给了相关部门，并要求他们优先处理。我们非常重视您的反馈，并会改进服务员的态度和问题解决的效率。", "timestamp": "2024-11-30T10:00:00"},
    {"user_id": 106, "agent_id": 206, "user": "我的账单上有一笔不明费用，为什么会出现这个问题？", "agent": "我这就为您查询，稍等一下。可以提供一下账单上的费用明细吗？我帮您查看一下。", "timestamp": "2024-11-30T09:50:00"},
    {"user_id": 106, "agent_id": 206, "user": "费用明细显示了一笔外卖订单费用，我没有在这个日期点下单过餐。", "agent": "感谢您的反馈。我们检查了您的账单，发现确实存在外卖平台错误的扣款。我们已联系商家进行退款，并会在3个工作日内将款项退回到您的账户。", "timestamp": "2024-11-30T10:10:00"},
    {"user_id": 107, "agent_id": 207, "user": "你们的客服响应太慢了，每次都需要等很长时间才能得到回复。", "agent": "很抱歉让您感到不便，我们会改进客服响应速度。感谢您的耐心等待。我们会尽快处理您的问题。", "timestamp": "2024-11-30T10:00:00"},
    {"user_id": 107, "agent_id": 207, "user": "我等待了半小时，还是没有任何回复，能不能加快处理速度？", "agent": "非常抱歉，我们的客服系统出现了暂时性的故障。技术团队已经开始修复，您遇到的问题将会尽快得到处理。", "timestamp": "2024-11-30T10:20:00"},
    {"user_id": 108, "agent_id": 208, "user": "我想要退货，这个商品质量不符合我的要求，怎么操作呢？", "agent": "请您提供订单号和商品信息，我们将为您处理退货事宜。退货流程一般会在3个工作日内完成。", "timestamp": "2024-11-30T10:10:00"},
    {"user_id": 108, "agent_id": 208, "user": "我已经提交了退货申请，但还没有收到任何确认，能帮我查一下吗？", "agent": "感谢您的耐心，您的退货申请已经处理完毕，目前正在等待仓库确认收货。预计会在48小时内完成退款。", "timestamp": "2024-11-30T10:30:00"},
    {"user_id": 109, "agent_id": 209, "user": "我的信用卡被盗用了，有一笔不明的消费，我应该怎么处理？", "agent": "请立即冻结您的信用卡，并联系银行处理相关事宜。如果需要，我们可以帮助您联系银行。", "timestamp": "2024-11-30T10:20:00"},
    {"user_id": 109, "agent_id": 209, "user": "我已经冻结了信用卡，但是银行还没有处理。你们能帮忙加速这个过程吗？", "agent": "我们已经联系了银行，告知他们您信用卡被盗用的情况。银行会尽快处理并提供赔偿，通常需要3-5个工作日。", "timestamp": "2024-11-30T10:40:00"},
    {"user_id": 110, "agent_id": 210, "user": "我最近买的车出现了发动机故障，已经带去修理厂检查过了，结果好像还是没修好。", "agent": "我们将安排专业技术人员尽快为您检查并解决问题。请放心，我们会尽最大努力确保问题得到解决。", "timestamp": "2024-11-30T10:30:00"},
    {"user_id": 110, "agent_id": 210, "user": "技术人员已经到达，开始检查，应该会很快解决。感谢你们的支持！", "agent": "感谢您的反馈！我们会继续关注您的车辆状况，确保您的问题彻底解决。", "timestamp": "2024-11-30T10:50:00"},
    {"user_id": 111, "agent_id": 211, "user": "我想了解一下你们最近推出的家庭保险政策，具体保障内容是什么？", "agent": "我们推出的家庭保险政策提供全方位保障，包括家庭财产损失、事故医疗以及意外伤害等。具体条款可以参见我们的官网，或给我您的信息，我帮您申请资料。", "timestamp": "2024-11-30T10:35:00"},
    {"user_id": 111, "agent_id": 211, "user": "我需要保险条款的详细信息，能否直接发给我？", "agent": "我已将相关条款和详细信息通过邮件发送到您的注册邮箱，请查收。如果有任何问题，随时联系我。", "timestamp": "2024-11-30T10:50:00"},
    {"user_id": 112, "agent_id": 212, "user": "我想取消之前的航班预订，怎么办？", "agent": "如果您要取消航班预订，可以提供您的预订号，我会为您处理。如果取消的时间不超过24小时，可以全额退款。", "timestamp": "2024-11-30T10:40:00"},
    {"user_id": 112, "agent_id": 212, "user": "我已经提供了预订号，但还是没有收到退款确认。", "agent": "您的退款申请已成功提交，并且正在处理中。退款通常会在3-5个工作日内到账，请稍等。", "timestamp": "2024-11-30T11:00:00"},
]

# 主页路由
@app.route("/", methods=["GET", "POST"])
def index():
    keyword = request.args.get("keyword", "")
    start_date = request.args.get("start_date", "")
    end_date = request.args.get("end_date", "")

    # 连接数据库
    conn = sqlite3.connect("dialog_summary.db")
    cursor = conn.cursor()

    # 初始查询
    query = "SELECT * FROM dialogs WHERE 1=1"
    params = []  # 存储参数的列表

    # 根据输入的条件动态修改查询语句
    if keyword:
        query += " AND (user_message LIKE ? OR agent_message LIKE ?)"
        params.extend([f"%{keyword}%", f"%{keyword}%"])  # 添加两个参数（用于user_message和agent_message）

    if start_date:
        query += " AND timestamp >= ?"
        params.append(start_date)  # 添加起始日期参数

    if end_date:
        query += " AND timestamp <= ?"
        params.append(end_date)  # 添加结束日期参数

    # 执行查询
    cursor.execute(query, tuple(params))  # 使用元组传递参数
    dialogs = cursor.fetchall()
    conn.close()

    return render_template("index.html", dialogs=dialogs, keyword=keyword, start_date=start_date, end_date=end_date)


# 搜索结果路由
@app.route("/search_results", methods=["GET"])
def search_results():
    keyword = request.args.get("keyword", "")
    start_date = request.args.get("start_date", "")
    end_date = request.args.get("end_date", "")

    conn = sqlite3.connect("dialog_summary.db")
    cursor = conn.cursor()
    query = "SELECT * FROM dialogs WHERE 1=1"

    if keyword:
        query += " AND (user_message LIKE ? OR agent_message LIKE ?)"
    if start_date:
        query += " AND timestamp >= ?"
    if end_date:
        query += " AND timestamp <= ?"

    cursor.execute(query, (f"%{keyword}%", f"%{keyword}%", start_date, end_date))
    dialogs = cursor.fetchall()
    conn.close()

    return render_template("search_results.html", dialogs=dialogs, keyword=keyword, start_date=start_date,
                           end_date=end_date)
# 获取所有对话记录
def get_all_dialogs():
    conn = sqlite3.connect('dialog_summary.db')
    c = conn.cursor()
    c.execute('SELECT id, user_id, agent_id, user_message, agent_message, summary, labels, timestamp, created_at FROM dialogs')
    dialogs = c.fetchall()
    conn.close()
    return dialogs

if __name__ == '__main__':
    # 初始化数据库
    create_db()

    # 处理并存储对话
    #process_and_store_dialogs(dialogs)

    app.run(debug=True)

